ImmutaのABACとGlobal Subscription Policyを用いて特定のグループのユーザーだけにデータのアクセス権を付与してみた
さがらです。
ImmutaのABACとGlobal Subscription Policyを用いて特定のグループのユーザーだけにデータのアクセス権を付与してみたので、その内容を本記事でまとめてみます。
ABACとは
ABACとはAttribute-based access controlの略で、ユーザー、データなどに紐づく複数の属性(Attribute)の情報を元にデータアクセスを許可・制限するアプローチです。
Snowflakeなどでも採用されているRBAC(Role-based access control)は、1つのロールごとに固有の権限を持たせてアクセス権を管理する手法ですが、ユーザーの属性情報(部署・役職・etc)など複数の情報に基づいてアクセス権を管理しようとすると、1つのロールでアクセス権を管理することがつらくなってしまい多くのロールを作らなければいけないケースが発生しうると思います。
その点、Immutaで採用しているABACでは、ユーザーの属性情報、データのタグ、など複数の情報を用いてアクセス権の制御を行えるようになるため、より複雑なセキュリティ要件であってもロールをたくさん作ることが発生せず運用が楽になるメリットがあります。
ImmutaのABACについては以下の記事でも説明がされているため、こちらも併せてご覧ください。
Global Subscription Policyとは
Immutaでは「対象のデータソースをどのユーザーに見せるか」という条件をSubscription Policyとして定義しますが、Immutaで管理しているデータソース全体に適用されるSubscription Policyが「Global Subscription Policy」です。
Global Subscription Policyについて詳しくは下記のブログでまとめられていますので、実際にどのような条件で設定が出来るか知りたい場合はこちらのブログをご覧ください。
本検証で行うこと
組織の中にHRグループとSalesグループがあり、HRグループにしか見せたくないCOMPANY_EMPLOYEES
テーブルがSnowflake上にあるとします。
ここで以下2名のユーザーについて、HRグループに属するIMMUTATEST_SAGARA2
にだけCOMPANY_EMPLOYEES
テーブルを見せることができるよう、Immuta上で設定をしてみます。
IMMUTATEST_SAGARA2
:HRグループに属するため、COMPANY_EMPLOYEES
テーブルを見せたいIMMUTATEST_SAGARA3
:Salesグループに属するため、COMPANY_EMPLOYEES
テーブルを見せたくない
事前準備
Snowflake上でのユーザーの作成
まず今回の検証にあたり、連携先となるSnowflake上でユーザーIMMUTATEST_SAGARA2
とIMMUTATEST_SAGARA3
を作成しておきます。
この時点ではPUBLIC
ロールしか付与されておらず、サンプルデータのDBしか見えない状態です。
Immuta上でのユーザーの作成
続いて、Immuta Accounts上でもIMMUTATEST_SAGARA2
とIMMUTATEST_SAGARA3
のメールアドレスを用いて、ユーザー作成しておく必要があります。
今回はAdd Multiple Usersを用いて下図のように作成しました。
この上で、使用するImmutaのインスタンス上でもこれらのユーザーを追加しておきます。Sync IAM Users
を押せば、新しく追加したユーザーをImmutaインスタンスに追加することが出来ます。
また、各ユーザーをImmutaインスタンスに追加した後、ImmutaとSnowflakeを紐付けるためにSnowflakeのUsernameを変更しておきます。
Immuta上のユーザーの画面から、左上の名前の横の点々を押し、Change Snowflake Username
を押します。
ここで、SnowflakeのユーザーのProfileで確認できるUsername
を、表示されたポップアップのSnowflake Username
に入力し、Save
を押します。
Immuta上でのGroupの定義
今回はImmutaのGroup
機能を用いて、HRグループとSalesグループの作成を行います。
ImutaのPeople
メニューから、Groups
タブを押し、+ New Group
を押します。
Group Name
やGroup Description
を入力し、Save
を押します。
続いて、+ Add Members
から対象のユーザーを追加します。
Search by Member Name or Email
からImmutatest sagara2
を探し、選択します。下図の状態になっていれば、対象のグループにメンバーが追加された状態となっています。
同じ手順で、Salesグループを作成し、Immutatest sagara3
を追加しておきます。作成後の対象グループの画面が下図になります。
参考:Groupに対するAttributesの定義
また、Groupに対してAttributesという形で属性情報を付与することが出来ます。
この機能を使うと、1つのGroupに対して別の属性情報を複数付与することが可能となり、後述するGlobal Subscription Policyの定義時にこのAttributesを用いて条件設定することも可能です。
複数Groupに共通する属性情報などがあれば、このAttributesを使うことでより効率よくGlobal Subscription Policyの定義ができそうですね。
Immuta上でデータソースにタグを紐付ける
続いて必須の設定ではないのですが、データソースに対してグループ毎のタグを設定すると今後もHRグループ専用のデータが作成されたときに自動的にアクセス権を付与することができるため、データソースに対するタグの紐づけを行っていきます。
タグの作成
まずはタグを作成するところからです。
ImmutaのGovernance
メニューから、Tags
タブを押し、+ Add Tags
を押します。
今回は部署に関するタグを作成するため、Enter tag name
のところにdepartment
と入れます。
続いてAdd Child Tag
を押し、hr
とsales
という部署名に当たるタグを追加します。同じ階層でタグを作りたい場合は、Add Sibling Tag
を押せばOKです。
下図のように、department
タグの子タグとしてhr
とsales
ができていればOKです。この状態になったらSave
を押せば、タグの作成は完了です。
タグをデータソースに紐付ける
続いて、作成したタグをデータソースに紐づけていきます。
対象となるCOMPANY_EMPOLOYEES
テーブルの画面を開き、Overvuew
タブで+ Add Tags
を押します。
Search by Tag Name
から、先程作成したdepartment.hr
を探し、クリックします。
選択したら、Add
を押します。これでデータソースへのタグの紐づけは完了です!
Global Subscription Policyの作成
これまでに定義したグループやタグの情報を用いて、どのユーザーにデータのアクセス権を付与するのかの条件を定義するGlobal Subscription Policyを作成していきます。
ImmutaのPolicies
メニューから、Subscription Policies
タブにおいて+ Add Subscription Policy
を押します。
まず、What is the name of this policy?
に作成するポリシーの名称を入力します。
続いて、How should this policy grant accesses?
では作成したグループに属するユーザーにアクセス権を付与したいので、Allow users with specific groups/attributes
を選択します。
すると、具体的にどのグループに対してアクセス権を付与する(Subscribeする)かの条件を定義するWho should be allowed to subscribe?
が出てきます。
最上部のチェックボックスはCreate using plain language
のままにしておくことでGUいベースで条件の定義ができます。
次のAllow users to subscribe when user
では、select condition
でis a member of group
を選択します。これで特定のグループに属しているユーザーを対象と出来ます。
続いてsearch for group
では、作成したグループであるsagara_hr
を選択します。
また、Allow Data Source Discovery
3つチェックボックスがあると思います。こちらのブログからの引用ですが、このような意味合いを持っていますので必要に応じてチェックしてください。
- Allow Data Source Discovery
- 条件に該当しなくても、そのデータソース自体の表示は許可します(存在がわかる)。
- Require Manual Subscription
- 条件に該当していても、サブスクリプションはユーザー側が手動で行う必要があります(Allow Anyoneの時のチェックボックスと同じ)。
- Request Approval to Access
- 条件に該当しなくても、アクセスのリクエストを行うことができるようになります。
- この設定をONにする場合、リクエストが来た時の承認者を決める必要があります。
次の項目Should this policy always be required or share responsibility?
ですが、これは対象のデータソースに対して複数のGlobal Subscription Policyが設定されている場合の挙動を決めることができます。
Always Required
:他のGlobal Subscription Policyの条件も満たしていないと、対象のデータソースを見ることができません。Share Responsibility
:他のGlobal Subscription Policyの条件含め、1つでも条件を満たしていれば対象のデータソースを見ることができます。
最後のWhere should this policy be applied?
ですが、このポリシーを適用するデータソースを決める設定です。
先程hr
タグを設定したデータソースのみに絞り込みたいため、On data sources
を押します。
select circumstance
ですが、tagged
を選択します。
search for tags
で、作成したdepartment.hr
のタグを選択します。
この設定後、対象となるデータソースの数が表示されます。department.hr
のタグを紐づけたのは1つだけなので、合っていますね。
あとはCreate Policy
を押して、すぐに有効化するためActivate Policy
を選択すれば、Global Subscription Policyの作成は完了です!
挙動確認
では、実際に連携先のSnowflakeでどうなっているかを見てみます!
HRグループに属しているユーザーの場合
まず、HRグループに属しているIMMUTATEST_SAGARA2
でみてみます。
IMMUTATEST_SAGARA2
でSnowflakeにログインしてみると、Immutaにより作られたロールがあることがわかります。IMMUTA_POLICY_...
で始まるロールは各ポリシーごとのロールとなるので、IMMUTA_USER_...
で始まるロールを選択すればOKです。
この上で、IMMUTA_USER_...
で始まるロールを選択すると、データの内容を無事に確認することが出来ました!
HRグループに属していないユーザーの場合
続いて、HRグループに属していないIMMUTATEST_SAGARA3
でみてみます。
IMMUTATEST_SAGARA3
でログインしてみると、このユーザーに対してImmuta経由でSubscribeしているデータがないため、Immutaで作られたロールも付与されていませんでした。
おまけ1:新しくHRグループのユーザーを追加するとどうなるか?
ここからはおまけですが、まずは新しくHRグループにユーザーを追加するとどうなるかを確認してみます。
これまでの検証ではHRグループに属していなかったIMMUTATEST_SAGARA3
を、sagara_hr
グループに新しく追加してみます。
この上でSnowflakeにIMMUTATEST_SAGARA3
でログインしてみると、Immutaで作られたロールが付与され、COMPANY_EMPLOYEES
テーブルが見れるようになっていました!
おまけ2:HRグループからユーザーを除外するとどうなるか?
次は逆に、HRグループからユーザーを除外するとどうなるか見てみます。
さきほどおまけ1でHRグループに追加したIMMUTATEST_SAGARA3
を、sagara_hr
から除外してみます。
この上でSnowflakeでIMMUTATEST_SAGARA3
でログインしてみると、IMMUTA_POLICY_...
で始まるロールが使えなくなり、COMPANY_EMPLOYEES
テーブルが見れなくなっていました。
グループから除外した際のアクセス権の削除も即座に行ってくれるのはありがたいですね!!
おまけ3:新しくHRタグを紐づけたデータソースを追加するとどうなるか?
おまけの最後に、新しくHRのタグを紐づけたデータソースを追加するとどうなるかを確認しておきます。
適当なデータソースに対して、department.hr
タグを追加します。
この上で、HRグループに属しているIMMUTATEST_SAGARA2
でログインしてみると、department.hr
タグを追加したUSERS_COL_EN_DATA_EN
を見ることができるようになっていました!
最後に
ImmutaのABACとGlobal Subscription Policyを用いて特定のグループのユーザーだけにデータのアクセス権を付与してみました。
一度タグやグループなどを用いてGlobal Subscriptionポリシーを設定しておけば、部署の異動などでユーザーが所属するグループが変わったときに即座に自動的にアクセス権を付与したり削除したりできるので、データアクセス権を管理する運用が非常に楽になると感じました!